const fp = require('lodash/fp')
const fs = require('fs')
class IO {
  static of(value) {
    return new IO(function () {
      return value
    })
  }
  constructor(fn) {
    this._value = fn
  }
  map(fn) {
    return new IO(fp.flowRight(fn, this._value))
  }
}
// 纯的
let readFile = function (filename) {
  return new IO(function () {
    // 同步读取文件
    return fs.readFileSync(filename, 'utf-8')
  })
}
let print = function (x) {
  return new IO(function () {
    console.log(x) // IO { _value: [Function (anonymous)] }
    return x
  })
}
// readFile把IO的函子传递给print
// print 得到的 x 就是一个IO函子 然后返回了一个返回值是IO函子的IO函子 IO(IO(x))
let cat = fp.flowRight(print, readFile)
// _value() 打印readFile的函子
// _value() 拿到文件内容
let r = cat('package.json')._value()._value()
// 嵌套的函子
console.log(r) // IO { _value: [Function (anonymous)] }
